package Java2Test.Reflect.Reflect5;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;

/**
 * 反射实现对象属性序列化保存
 * 功能：将对象的属性名和属性值写入指定文件
 */
public class Demo1 {
    public static void main(String[] args) throws IllegalAccessException, IOException {
        // 创建Student对象并初始化属性
        Student s = new Student("小A", 23, '女', 167.5, "睡觉");
        // 创建Teacher对象并初始化属性
        Teacher t = new Teacher("播妞", 10000);

        // 保存Student对象属性到文件
        saveObject(s);
        // 如需保存Teacher对象，取消下方注释
        // saveObject(t);
    }

    /**
     * 将对象属性信息写入文件
     * @param obj 待序列化的对象
     * @throws IllegalAccessException 反射访问异常
     * @throws IOException 文件操作异常
     */
    private static void saveObject(Object obj) throws IllegalAccessException, IOException {
        // 获取对象对应的Class类型
        Class<?> clazz = obj.getClass();

        // 以追加模式创建文件写入流（Windows路径使用反斜杠）
        BufferedWriter bw = new BufferedWriter(new FileWriter("src\\Java2Test\\Reflect\\Reflect5\\a.txt", true));
        bw.newLine(); // 写入换行符

        // 获取对象所有声明字段（含私有字段）
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field field : declaredFields) {
            field.setAccessible(true); // 突破访问权限限制
            String name = field.getName(); // 获取字段名称
            Object value = field.get(obj); // 获取字段值
            bw.write(name + "-" + value); // 按"字段名-值"格式写入
            bw.newLine(); // 每行结束换行
        }
        bw.close(); // 手动关闭文件流
    }
}